#ifndef PARTIE_H
#define PARTIE_H

#include <QtCore/QObject>
#include <QtCore/QPair>
#include <QtCore/QStringList>
#include <QtCore/QVector>

class Carte;
class QGraphicsPixmapItem;
template <typename Key, typename T> class QMap;
class QString;
//template <typename T> class QVector;

/*! \class Partie

    \brief Classe permettant d'effectuer une partie.

    Cette classe permet de superviser l'ensemble d'une partie.

    Elle est implémentée sous la forme d'un singleton afin de ne permettre qu'une seule partie à la fois.
*/
class Partie : public QObject {
    Q_OBJECT

public:
    static Partie* getInstance();
    static void destroy();

    inline QVector<Carte*>* getJeu() {return m_jeu;}
    
public slots:
    void init(QStringList pNomJoueurs, bool pPouce);
    void launch();

private:
    Partie();
    ~Partie();

    bool m_pouce;

    int m_index;
    static Partie *_instance;
    QStringList m_nomsJoueurs;

    QVector<QPair<int,int> > m_positions;

    /*! \brief Sabot.

          Liste des cartes constituants le sabot du jeu.
    */
    QVector<Carte*> *m_jeu;

    /*! \brief Liste des cartes du chien. */
    QVector<Carte*> *m_chien;

    /*! \brief Liste des jeux des différents joueurs. */
    QMap<Carte*, QString> *m_jeux;

    bool isCarteDistribuee(Carte* pCarte);

    void melanger();

    void distribuer(QString pNomJoueur, int pJeuIndex);
    void ajouterChien(int pJeuIndex);

    void afficherCarte(Carte* pC);

signals:
    void afficherCarteJoueur(QGraphicsPixmapItem *pCarte);
    void afficherCarteAutre(QGraphicsPixmapItem *pCarte);

};

#endif // PARTIE_H
